"""
难度：中等
请实现一个函数按照之字形顺序打印二叉树，即第一行按照从左到右的顺序打印,
第二层按照从右到左的顺序打印，
第三行再按照从左到右的顺序打印，其他行以此类推。
例如:
给定二叉树: [3,9,20,null,null,15,7],

    3
   / \
  9  20
    /  \
   15   7
返回其层次遍历结果：
[
  [3],
  [20,9],
  [15,7]
]
"""
"""
解题思路 #
广度优先搜索，在二叉树的层序遍历的基础上需要增加一些变化。

普通广度优先搜索只取一个元素，变化后的广度优先搜索每次取出第 i 层上所有元素。

新增一个变量 odd，用于判断当前层数是奇数层，还是偶数层。从而判断元素遍历方向。

存储每层元素的 level 列表改用双端队列，如果是奇数层，则从末尾添加元素。如果是偶数层，则从头部添加元素。

具体步骤如下：

根节点入队。
当队列不为空时，求出当前队列长度 ，并判断当前层数的奇偶性。
依次从队列中取出这  个元素。
如果为奇数层，如果是奇数层，则从 level 末尾添加元素。
如果是偶数层，则从 level头部添加元素。
然后保存将其左右子节点入队，然后继续迭代。
当队列为空时，结束。

"""
# Definition for a binary tree node.
import collections
from typing import Collection, List


class TreeNode:
    def __init__(self, x):
        self.val = x
        self.left = None
        self.right = None

class Solution:
    def levelOrder(self, root: TreeNode) -> List[List[int]]:
        if not root:
            return []
        queue = [root]
        order = []
        odd = True
        while queue:
            level = collections.deque()
            size =len(queue)
            for _ in range(size):
                curr = queue.pop(0)
                if odd:
                    level.append(curr.val)
                else:
                    level.appendleft(curr.val)
                if curr.left:
                    queue.append(curr.left)
                if curr.right:
                    queue.append(curr.right)
            if level:
                order.append(list(level))
            odd = not odd
        return order
